HDU_5754

思路

KING n,m 都为奇数 先手胜
ROOK m==n 先手必输
KNIGHT 令n < m , m%3==0 && n==m-1必输态, m==n && n%3==1 必胜态, 其余 和棋
QUEEN n– and m– (这个地方比赛时没注意,一直WA T_T) 构成威佐夫博弈。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <cstring>
using namespace std;
int n,m;
bool king(){
if(m%2==1 && n%2==1)return 0;
return 1;
}
bool rook(){
if(n==m)return 0;
return 1;
}
int knight(){
if(m<n)swap(m,n);
if(m%3==0 && n==m-1) return 1;
else if(m==n && m%3==1) return -1;
return 0;
}
bool queen(){
n--;m--;
if(m<n)swap(m,n);
bool ans=1;
if((int)((m-n)*(sqrt(5.0)+1.0)/2.0)==n) ans=0;
return ans;
}
int main(){
int T;scanf("%d",&T);
while(T--){
int type;int ans=0;
scanf("%d%d%d",&type,&n,&m);
if(type==1) ans=king();
else if(type==2)ans=rook();
else if(type==3)ans=knight();
else ans=queen();
if(type!=3){
if(ans){
puts("B");
}
else
puts("G");
}
else{
if(ans>0)
puts("B");
else if(ans==0)
puts("D");
else puts("G");
}
}
return 0;
}